package remote

import (
	game "framework/game"
	"github.com/nats-io/nats.go"
	"go.uber.org/zap"
)

/*
*
nats的客户端
这个事要实现Client
*/
type NatsClient struct {
	serverId string      //外部传入
	readChan chan []byte //外部传入
	conn     *nats.Conn
}

/*
*
启动nats客户端
*/
func (n *NatsClient) Run() error {
	connect, err := nats.Connect(game.Conf.ServersConf.Nats.Url)
	if err != nil {
		zap.S().Errorf("nats connect fail:%v", err)
		return err
	}
	n.conn = connect
	//发起订阅
	go n.sub()
	return err
}

func (n *NatsClient) SendMsg(dst string, data []byte) error {
	err := n.conn.Publish(dst, data)
	if err != nil {
		zap.S().Errorf("nats sendMessage fail:%v", err)
		return err
	}
	return nil
}

/*
*
nats 客户端关闭
*/
func (n *NatsClient) Close() error {
	if n.conn != nil {
		n.conn.Close()
	}
	return nil
}

/*
*
订阅消息
*/
func (n *NatsClient) sub() {
	zap.S().Infof("application:%s ready to subscribe", n.serverId)
	_, err := n.conn.Subscribe(n.serverId, func(msg *nats.Msg) {
		//收到其他的nats  client发送给自己的消息
		n.readChan <- msg.Data
	})
	if err != nil {
		zap.S().Errorf("nats sub fail:%v", err)
	}
}

/*
*
实例化Client 其实这个方法也可以返回Client
*/
func NewNatsClient(serverId string, readChan chan []byte) *NatsClient {
	return &NatsClient{
		serverId: serverId,
		readChan: readChan,
	}
}
